package cn.yh.nft.turbo.order.sharding.strategy;

/**
 * @ClassName: DefaultShardingTableStrategy
 * @Author: 草莓爱上啵啵
 */
public class DefaultShardingTableStrategy implements ShardingTableStrategy{

    public DefaultShardingTableStrategy() {}

    /**
 * 根据外部ID和表的数量，确定外部ID应该归属的表
 * 此方法用于在多个表之间均匀分布数据，基于外部ID进行哈希分片
 *
 * @param externalId 外部系统的唯一标识符，用于计算哈希值
 * @param tableCount 表的数量，用于决定外部ID应分配到哪个表
 * @return 返回外部ID应归属的表的索引
 */
@Override
public int getTable(String externalId, int tableCount) {
    // 计算外部ID的哈希值，以便进行分片
    int hashCode = externalId.hashCode();
    // 使用取绝对值和取模操作来决定外部ID归属的表
    // 这里使用Math.abs转换为正数，避免哈希值为负数
    // 使用%操作符确保结果在表的数量范围内
    return (int) Math.abs((long) hashCode) % tableCount;
    // 为了性能更好，可以优化成：return (int) Math.abs((long) hashCode) & (tableCount - 1); 具体原理参考 hashmap 的 hash 方法
    // 这种优化方式在tableCount是2的幂次方时特别有效，可以替代%操作，提高性能
}

}
